<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        let _arr = [1,2,3,4]
        let data = {}
        Object.defineProperty(data,"arr",{
            get(){
                console.log("data.arr getter")
                return _arr
            },
            set(nv){
                console.log("data.arr setter")
                _arr = nv
            }
        })
        // 浏览器控制台运行结果


        // > data.arr
        // < data.arr getter
        // < (4) [1, 2, 3, 4]

        // > data.arr = [22,333,444]
        // < data.arr setter
        // < (3) [22, 333, 444]



        // > data.arr[0]
        // < data.arr getter
        // < 1

        // Object.defineProperty 对变量的控制只针对栈中数据的变量完成监控，
        //                       如果监控数据为引用类型，修改堆中数据时，栈中定义不会发生变化，不触发setter方法
        //                       引用数据类型的堆数据获取，是需要通过栈地址指向调用的方式加载的，所以会触发getter方法

        // > data.arr[0] = 111;
        // < data.arr getter
        // < 111
       
    </script>
</head>
<body>
    
</body>
</html>